package com.xiyou.weblog.admin.service.impl;

import com.xiyou.weblog.admin.model.vo.user.FindUserInfoRspVO;
import com.xiyou.weblog.admin.model.vo.user.UpdateAdminUserPasswordReqVO;
import com.xiyou.weblog.admin.service.AdminUserService;
import com.xiyou.weblog.common.domain.mapper.UserMapper;
import com.xiyou.weblog.common.enums.ResponseCodeEnum;
import com.xiyou.weblog.common.utils.Response;
import jakarta.annotation.Resource;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.stereotype.Service;

@Service
public class AdminUserServiceImpl implements AdminUserService {

    @Resource
    private UserMapper userMapper;

    @Resource
    /*我们存储密码并不是使用明文进行存储的，而是通过前面的整合 Spring Security 小节中，初始化的 PasswordEncoder 密码加密器，先对密码进行加密，再更新到数据库中，提高密码的安全性*/
    private PasswordEncoder passwordEncoder;


    @Override
    public Response findAdminInfo() {
        // 获取存储在 ThreadLocal 中的用户信息
        // 之前在实现用户登录认证功能时，我们已经将用户的相关信息存储在了 Spring Security 的上下文中
        Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
        // 拿到用户名
        String username = authentication.getName();

        return Response.success(FindUserInfoRspVO.builder().username(username).build());
    }

    /**
     * 修改密码
     * @param updateAdminUserPasswordReqVO 修改密码的参数
     */
    @SuppressWarnings("rawtypes")
    @Override
    public Response updatePassword(UpdateAdminUserPasswordReqVO updateAdminUserPasswordReqVO) {
        // 拿到用户,密码
        String password = updateAdminUserPasswordReqVO.getPassword();
        String username = updateAdminUserPasswordReqVO.getUsername();

        // 加密
        String encodePassword = passwordEncoder.encode(password);

        //更新到数据库
        int count = userMapper.updatePasswordByUsername(username, encodePassword);

        return count == 1 ? Response.success() : Response.fail(ResponseCodeEnum.USERNAME_NOT_FOUND);
    }
}
